from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client
from django.conf import settings

@deconstructible
class FDFSStorage(Storage):
    """FDFS文件存储类"""

    def __init__(self, client_conf=None, base_url=None):
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
            self.client_conf = client_conf

        if base_url is None:
            base_url = settings.FDFS_NGINX_URL

            self.base_url = base_url

    def _save(self, name, content):
        """

        :param name:上传文件的名称
        :param content: 保存上传文件的file对象，可以通过content.read()获取上传文件的内容
        :return: none
        """
        # client = Fdfs_client("<客户端配置文件路径>")
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.client_conf)

        # 上传文件到FDFS系统
        res = client.upload_by_buffer(content.read())

        if res.get('Status') != 'Upload successed.':
            # 上传文件失败
            raise Exception('上传文件到FDFS系统失败')

        # 获取file_id
        file_id = res.get('Remote file_id')

        return file_id

    def exists(self, name):
        """
        判断上传的文件和文件系统中原有的文件名称是否冲突
        name: 上传文件的名称 1.jpeg
        """
        return False

    def url(self, name):
        # return name

        # return settings.FDFS_NGINX_URL + name
        return self.base_url + name
